// 1.不确定函数的参数与返回值 使用any 但是我们之前说过any存在隐患 会跳过TS的检测机制
function fn(a: any): any {
  return a;
}


// 2.定义函数或类时, 如果遇到类型不明确就可以使用泛型
// <T> 定义泛型: 不使用any也可以达到效果 只有在函数被调用时才知道T的类型 类型推断
function fn2<T>(a: T): T {
  return a;
}

console.log(fn2("小陈"));
console.log(fn2(110));
// 指定泛型
console.log(fn2<number>(120));


// 3.指定多个泛型
function fn3<T, K>(a: T, b: K): T {
  return a;
}


// 4.通过接口限制泛型范围
interface Inter1 {
  // 必须包含length属性
  length: number
}

// T extens Inter1 必须是Inter1的实现类 满足接口的要求
function fn4<T extends Inter1>(a: T): number {
  return a.length;
}

fn4("字符串类型ok 因为有length属性");
// fn4(11); // 类型"number"的参数不行 因为没有length属性
fn4({ name: "Mr.chen", length: 11 });